//---------------------------------------------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
#ifndef _MakeCPPClass_h__
#define	_MakeCPPClass_h__
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
#include "libraries.h"
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
class Attribute {
  
  private:
    
    String*           attributeName;
    char              attributeScope;
    String*           attributeType;
    TListE <String>*  attributeIncludes;
    String*           toString;
    
  public:
    
    Attribute ();
    Attribute (const Attribute&);
    Attribute (const Attribute*);
    
    ~Attribute ();
    
    void              AttributeName (String*);
    void              AttributeScope (char);
    void              AttributeType (String*);
    void              AttributeIncludes (TListE <String>*);

    String*           AttributeName (void);
    char              AttributeScope (void);
    String*           AttributeType (void);
    TListE <String>*  AttributeIncludes (void);
    
    bool              LoadAttributeInfo (String*);
    bool              LoadAttributeInfo (char*);
    
    String*           GetAttributeDefinition (int);
    String*           GetParameterDefinition (void);
    String*           GetIncludes (void);
    
    String*           GetAttributeSetMethodDefinition (int);
    String*           GetAttributeGetMethodDefinition (int);
    
    String*           GetAttributeSetMethodDeclaration (String*);
    String*           GetAttributeGetMethodDeclaration (String*);
    
    Attribute         operator= (const Attribute&);

};
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
class Method {
  
  private:
    
    String*               methodName;
    char                  methodScope;
    String*               methodReturn;
    TListE <Attribute>*   methodParameters;
    TListE <String>*      methodIncludes;
    String*               toString;
    
  public:
    
    Method ();
    Method (const Method&);
    Method (const Method*);
    
    ~Method ();
    
    void                  MethodName (String*);
    void                  MethodScope (char);
    void                  MethodReturn (String*);
    void                  MethodParameters (TListE <Attribute>*);
    void                  MethodIncludes (TListE <String>*);

    String*               MethodName (void);
    char                  MethodScope (void);
    String*               MethodReturn (void);
    TListE <Attribute>*   MethodParameters (void);
    TListE <String>*      MethodIncludes (void);
    
    bool                  LoadMethodInfo (String*);
    bool                  LoadMethodInfo (char*);
    
    String*               GetMethodDefinition (int);
    String*               GetMethodDeclaration (String*);
    String*               GetIncludes (void);
    
    Method                operator= (const Method&);

};
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
class MakeCPPClass {
  
  private:
    
    String*                     className;
    TListE <String>*            classInheritance;
    TListE <Attribute>*         classAttributes;
    TListE <Method>*            classMethods;
    
    String*                     toString;
    
  protected:
    
    bool                        ConstructListIncludes (TListE <String>*);

  public:
    
    MakeCPPClass ();
    MakeCPPClass (const MakeCPPClass&);
    MakeCPPClass (const MakeCPPClass*);
    
    ~MakeCPPClass ();
    
    void                        ClassName (String*);
    void                        ClassInheritance (TListE <String>*);
    void                        ClassAttributes (TListE <Attribute>*);
    void                        ClassMethods (TListE <Method>*);
    
    String*                     ClassName (void);
    TListE <String>*            ClassInheritance (void);
    TListE <Attribute>*         ClassAttributes (void);
    TListE <Method>*            ClassMethods (void);
    
    bool                        LoadClassInfo (String*);
    bool                        LoadClassInfo (char*);
    
    bool                        ConstructCPPClass (void);
    String*                     GetHeaderCPPClass (void);
    String*                     GetSourceCPPClass (void);
    
    MakeCPPClass                operator= (const MakeCPPClass&);

};
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
#endif
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
/* 
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
MODEL TO USE (Without the lines)
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
Name: ClassName (inheritance;inheritance)

+Attribute: AttributeName (Type[@Include;...])
-Attribute: AttributeName (Type[@Include;...])
*Attribute: AttributeName (Type[@Include;...])

+Method: MethodName (Type{ParameterName}[@Include];...) = Type
-Method: MethodName (Type{ParameterName}[@Include];...) = Type
*Method: MethodName (Type{ParameterName}[@Include];...) = Type
//---------------------------------------------------------------------------------------------------------------------------------------------------------//
 */
